


#ifndef _C_POINT___H_
#define _C_POINT___H_





#include"stl_type.h"


/// <summary>
/// C语言接口的矢量结构体
/// </summary>
typedef struct _vector_2d__
{
	real_t x;
	real_t y;
}vec2;

/// <summary>
/// C语言接口的矢量结构体
/// </summary>
typedef struct _vector_3d__
{
	real_t x;
	real_t y;
	real_t z;
}vec3;

/// <summary>
/// C语言接口的矢量结构体.齐次矢量
/// </summary>
typedef struct _vector_4d__
{
	real_t w;
	real_t x;
	real_t y;
	real_t z;
}vec4;

/// <summary>
/// 矢量归一化
/// </summary>
/// <param name="v">向量</param>
/// <returns>模长归一化的矢量</returns>
vec2 vec2_normalize(vec2 v);

/// <summary>
/// 向量打印函数
/// </summary>
/// <param name="v">打印的向量</param>
void vec2_print(vec2 v);

/// <summary>
/// 判断两个向量是否相等
/// </summary>
/// <param name="vA">向量A</param>
/// <param name="vB">向量B</param>
/// <param name="precision">精度要求</param>
/// <returns>如果向量每个元素的差都小于精度要求，说明两个向量相等</returns>
bool vec2_isEqual(vec2 vA, vec2 vB, real_t precision);

/// <summary>
/// 判断向量是否零向量
/// </summary>
/// <param name="v">向量</param>
/// <param name="precision">精度要求</param>
/// <returns>如果向量每个元素的值都小于精度要求，说明是零向量</returns>
bool vec2_isZero(vec2 v, real_t precision);

/// <summary>
/// 实现向量之间的加法
/// </summary>
/// <param name="A">向量A</param>
/// <param name="B">向量B</param>
/// <returns>A + B</returns>
vec2 vec2_add(vec2 A, vec2 B);

/// <summary>
/// 实现向量之间的减法
/// </summary>
/// <param name="A">向量A</param>
/// <param name="B">向量B</param>
/// <returns>A - B</returns>
vec2 vec2_sub(vec2 A, vec2 B);

/// <summary>
/// 实现向量与数的乘法
/// </summary>
/// <param name="A">向量A</param>
/// <param name="r">实数r</param>
/// <returns>A * r</returns>
vec2 vec2_mul(vec2 A, real_t r);

/// <summary>
/// 计算两个向量之间的点乘。向量A和向量B的元素个数不需要一致，低维向量在高维度的分量默认为零。
/// </summary>
/// <param name="A">向量A</param>
/// <param name="B">向量B</param>
/// <returns>点乘的结果</returns>
real_t vec2_dotProduct(vec2 A, vec2 B);

/// <summary>
/// 计算向量模长。
/// </summary>
/// <param name="v">向量</param>
/// <returns>模长 </returns>
real_t vec2_length(vec2 v);

/// <summary>
/// 计算向量模长的平方。
/// </summary>
/// <param name="v">向量</param>
/// <returns>模长平方 </returns>
real_t vec2_length_square(vec2 v);

/// <summary>
/// 计算矢量的曼哈顿距离Manhattan distance。
/// </summary>
/// <param name="v">向量</param>
/// <returns> 曼哈顿距离 = (|v[0]|+|v[1]|+|v[2]|+…+|v[n]|) </returns>
real_t vec2_manhattan(vec2 v);

/// <summary>
/// 计算矢量v1到v2的曼哈顿距离Manhattan distance。
/// </summary>
/// <param name="v1">向量</param>
/// <param name="v2">向量</param>
/// <returns> 曼哈顿距离 = (|v1[0]-v2[0]|+|v1[1]-v2[1]|+……) </returns>
real_t vec2_manhattan_2(vec2 v1, vec2 v2);

/// <summary>
/// 线性插值函数。从a到b设一个参数t，0<t<1, 返回c。 若t=0，c=a，若t=1，c=b.
/// </summary>
/// <param name="a">起点</param>
/// <param name="b">终点</param>
/// <param name="t">参数</param>
/// <returns>插值点 = a*(1-t)+b*t</returns>
vec2 vec2_interpolation(vec2 a, vec2 b, real_t t);




/// <summary>
/// 矢量归一化
/// </summary>
/// <param name="v">向量</param>
/// <returns>模长归一化的矢量</returns>
vec3 vec3_normalize(vec3 v);

/// <summary>
/// 向量打印函数
/// </summary>
/// <param name="v">打印的向量</param>
void vec3_print(vec3 v);

/// <summary>
/// 判断两个向量是否相等
/// </summary>
/// <param name="vA">向量A</param>
/// <param name="vB">向量B</param>
/// <param name="precision">精度要求</param>
/// <returns>如果向量每个元素的差都小于精度要求，说明两个向量相等</returns>
bool vec3_isEqual(vec3 vA, vec3 vB, real_t precision);

/// <summary>
/// 判断向量是否零向量
/// </summary>
/// <param name="v">向量</param>
/// <param name="precision">精度要求</param>
/// <returns>如果向量每个元素的值都小于精度要求，说明是零向量</returns>
bool vec3_isZero(vec3 v, real_t precision);

/// <summary>
/// 实现向量之间的加法
/// </summary>
/// <param name="A">向量A</param>
/// <param name="B">向量B</param>
/// <returns>A + B</returns>
vec3 vec3_add(vec3 A, vec3 B);

/// <summary>
/// 实现向量之间的减法
/// </summary>
/// <param name="A">向量A</param>
/// <param name="B">向量B</param>
/// <returns>A - B</returns>
vec3 vec3_sub(vec3 A, vec3 B);

/// <summary>
/// 实现向量与数的乘法
/// </summary>
/// <param name="A">向量A</param>
/// <param name="r">实数r</param>
/// <returns>A * r</returns>
vec3 vec3_mul(vec3 A, real_t r);

/// <summary>
/// 计算两个向量之间的点乘。
/// </summary>
/// <param name="A">向量A</param>
/// <param name="B">向量B</param>
/// <returns>点乘的结果</returns>
real_t vec3_dotProduct(vec3 A, vec3 B);

/// <summary>
/// 计算矢量叉乘	
/// </summary>
/// <param name="A">向量A</param>
/// <param name="B">向量B</param>
/// <returns> A 叉乘 B</returns>
vec3 vec3_crossProduct(vec3 A, vec3 B);

/// <summary>
/// 计算向量模长。
/// </summary>
/// <param name="v">向量</param>
/// <returns>模长 </returns>
real_t vec3_length(vec3 v);

/// <summary>
/// 计算向量模长的平方。
/// </summary>
/// <param name="v">向量</param>
/// <returns>模长平方 </returns>
real_t vec3_length_square(vec3 v);

/// <summary>
/// 计算矢量的曼哈顿距离Manhattan distance。
/// </summary>
/// <param name="v">向量</param>
/// <returns> 曼哈顿距离 = (|v[0]|+|v[1]|+|v[2]|+…+|v[n]|) </returns>
real_t vec3_manhattan(vec3 v);

/// <summary>
/// 计算矢量v1到v2的曼哈顿距离Manhattan distance。
/// </summary>
/// <param name="v1">向量</param>
/// <param name="v2">向量</param>
/// <returns> 曼哈顿距离 = (|v1[0]-v2[0]|+|v1[1]-v2[1]|+……) </returns>
real_t vec3_manhattan_2(vec3 v1, vec3 v2);

/// <summary>
/// 线性插值函数。从a到b设一个参数t，0<t<1, 返回c。 若t=0，c=a，若t=1，c=b.
/// </summary>
/// <param name="a">起点</param>
/// <param name="b">终点</param>
/// <param name="t">参数</param>
/// <returns>插值点 = a*(1-t)+b*t</returns>
vec3 vec3_interpolation(vec3 a, vec3 b, real_t t);



/// <summary>
/// 这里vec4表示齐次坐标。	
/// 将其次坐标规范化后返回,齐次坐标变成三维坐标
/// </summary>
/// <param name="v">向量</param>
/// <returns>其次坐标规范化后的矢量</returns>
vec4 vec4_normalize(vec4 v);

/// <summary>
/// 这里vec4表示齐次坐标。	
/// 将其次坐标规范化后返回,齐次坐标变成三维坐标
/// 但是本函数计算后将会保留ω分量，而不是将其置为1
/// </summary>
/// <param name="v">向量</param>
/// <returns>其次坐标规范化后的矢量</returns>
vec4 vec4_normalizeSpecial(vec4 v);












#endif

